Программное
изменение структуры и схемы данных
Для изменения
схемы данных создан
язык определения данных
(DDL, Data-Definition Language).
Инструкции на языке DDL позволяют выполнять действия по изменению схемы данных
и структуры объектов данных, например:
-
создавать и удалять
таблицы;
-
добавлять и удалять
из таблиц поля и индексы;
-
создавать и удалять
связи между таблицами.
В интерфейсе
DАО имеется набор специальных объектов, который является интерфейсом для доступа
к средствам DDL. Таким образом, с помощью объектов DАО можно управлять структурой
таблиц и схемой данных, не составляя самих инструкций на языке DDL.
Следующий
пример программного кода (программа 16.4) взят из процедуры initGame сервера
приложения "Игра в доминирование". Этот пример иллюстрирует использование
инструкций на языке DDL для удаления таблицы со старой структурой и создания
новой таблицы с заданной структурой. Аналогичные действия можно выполнить, пользуясь
объектно-ориентированным интерфейсом DАО. Целью этой процедуры является изменение
структуры таблицы "ПолеИгрок", поэтому, вообще говоря, можно было
бы изменить набор полей этой таблицы с помощью инструкции DDL ALTER TABLE. Эта
инструкция позволяет удалить или добавить в таблицу поле или составной индекс.
Удаление и добавление полей в таблицу средствами DDL через интерфейс DАО представлено
в программе 16.5.
Замечание
Необходимо помнить
о том, что изменение структуры связанных таблиц запрещено. Поэтому в примере
(программы 16.4 и 16.5) для доступа к таблице "ПолеИгрок" открывается
база данных DominationGame.mdb, в которой сохранена эта таблица, а не используется
текущая база данных DominationGameServer.mdb, в которой установлена связь
с этой таблицей.
Программа
16.4. Удаление и создание таблицы с помощью инструкций DDL
Dim
db As Database
Dim
fieldSize As Long, i As Long
Dim
strDDL As String
'
Узнаем линейный размер игрового поля, выраженный в клетках
fieldSize
= CLng(get_parameter("РазмерПоля"))
'
Открываем базу данных, в которой хранится нужная таблица
Set
db = OpenDatabase(CurrentProject.Path & "\DominationGame.mdb")
'
Удалить старую таблицу "ПолеИгрок" strDDL = "DROP TABLE ПолеИгрок;"
'
Если таблица не существует, удаление вызовет ошибку
On
Error GoTo the_next_2
db.Execute
strDDL the_next_2:
On
Error GoTo 0
'
Создать новую таблицу "ПолеИгрок"
strDDL
= "CREATE TABLE ПолеИгрок ("
For
i = 1 To fieldSize - 1
strDDL
= strDDL & get_column_name(i) & " TEXT(20), "
Next
i
strDDL
= strDDL & get_column_name(fieldSize)
& "
TEXT(20) );"
db.Execute
strDDL
'
Прочие действия ... db.Close
Программа
16.5. Изменение структуры таблицы с помощью интерфейса DАО
Dim
db As Database
Dim
fieldSize As Long, i As Long
Dim
strSQL As String
Dim
fid As Field
'
Узнаем линейный размер игрового поля, выраженный в клетках
fieldSize
= CLng(get_parameter("РазмерПоля"))
'
Открываем базу данных, в которой хранится нужная таблица
Set
db = OpenDatabase(CurrentProject.Path & "\DominationGame.mdb")
'
Удалить старые записи в таблице "ПолеИгрок"
StrSQL
= "DELETE * FROM ПолеИгрок;" db.Execute strSQL
'
Удалить старые поля в таблице "ПолеИгрок"
For
i = 1 То db.TableDefs("ПолеИгрок").Fields.Count
db.TableDefs("ПолеИгрок").Fields.Delete
get_column_name(i)
Next i
'
'Создать новые поля в таблице "ПолеИгрок"
For
i = 1 То fieldSize
Set
fid = db.TableDefs("ПолеИгрок").CreateField( _
get_column_name(i),
dbText, 20)
db.TableDefs("ПолеИгрок").Fields.Append
fid
Next
I
'
Прочие действия ...
db.Close
В программе
16.5 проиллюстрировано удаление и добавление полей в таблицу "ПолеИгрок"
средствами DDL с использованием интерфейса DАО. Удаление поля производится с
помощью метода Delete, в качестве параметра которого указывается имя удаляемого
поля. Добавление нового поля производится следующим образом. Создается новый
объект Field, обладающий необходимыми характеристиками — заданным именем поля,
типом и размером данных. После этого с помощью метода Append созданный объект
Field добавляется в семейство Fields объекта TableDef, содержащее все поля таблицы
"ПолеИгрок". Аналогично (с помощью DАО) можно выполнить создание и
удаление таблиц и индексов.
Содержание раздела
|